package com.ihy.controller;

import com.ihy.domain.User;
import com.ihy.service.ServiceUser;
import com.ihy.utils.RedisTemplateUtil;
import com.ihy.vo.ResultResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 忘记密码功能前端处理程序
 * <p>
 * RestController注解：
 * 相当于@ResponseBody ＋ @Controller合在一起的作用。
 * <p>
 * ResponseBody注解:
 * 将controller的方法返回的对象通过适当的转换器转换为指定的格式之后，写入到response对象的body区，通常用来返回JSON数据或者是XML数据。
 * 注意：在使用此注解之后不会再走视图处理器，而是直接将数据写入到输入流中，他的效果等同于通过response对象输出指定格式的数据。
 * <p>
 * Controller注解:
 * 用于标记在一个类上，使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法，并检测该方法是否使用了@RequestMapping注解。
 * Controller注解只是定义了一个控制器类，而使用@RequestMapping 注解的方法才是真正处理请求的处理器。
 * <p>
 * RequestMapping注解：
 * 是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
 * <p>
 * 它有六个属性，下面我们把它分成三类进行说明。
 * <p>
 * 1、 value， method；
 * value：     指定请求的实际地址，指定的地址可以是URI Template 模式；
 * method：  指定请求的method类型， GET、POST、PUT、DELETE等；
 * <p>
 * 2、 consumes，produces；
 * consumes： 指定处理请求的提交内容类型（Content-Type），例如application/json, text/html;
 * produces:    指定返回的内容类型，仅当request请求头中的(Accept)类型中包含该指定类型才返回；
 * <p>
 * 3、 params，headers；
 * params： 指定request中必须包含某些参数值是，才让该方法处理。
 * headers： 指定request中必须包含某些指定的header值，才能让该方法处理请求。
 * <p>
 * CrossOrigin注解：
 * 用于允许特定处理程序类和/或处理程序方法上的跨源请求的注解如果配置了适当的HandlerMapping，则进行处理。
 * Spring Web Mvc和Spring Web Flux都通过各自模块中的RequestMappingHandlerMapping支持这种注解。
 * 来自每个类型和方法级别的注释对的值被添加到CorsConfiguration，然后通过CorsConfiguration.applyPermitDefaultValues()应用默认值。
 * 组合全局和局部配置的规则通常是相加的——例如，所有全局和所有局部源。
 * 对于那些只能接受单个值的属性，如allowCredentials和maxAge，本地值将覆盖全局值。
 * <p>
 * Autowired注解:
 * 将构造函数、字段、setter方法或config方法标记为由Spring的依赖注入工具自动连接。
 * Autowired注解是按照类型（byType）装配依赖对象，默认情况下它要求依赖对象必须存在，如果允许null值，可以设置它的required属性为false。
 * 如果我们想使用按照名称（byName）来装配，可以结合@Qualifier注解一起使用。(通过类型匹配找到多个candidate,在没有@Qualifier、@Primary注解的情况下，会使用对象名作为最后的fallback匹配)
 */
@RestController
@Slf4j
//处理跨域请求
@CrossOrigin
@RequestMapping("/ForgetPassword")
public class ForgetPasswordController {
    @Autowired
    private ServiceUser serviceUser;
    @Autowired
    private ResultResponse resultResponse;
    @Autowired
    private RedisTemplateUtil redisTemplateUtil;

    //发送验证码
    @RequestMapping("phoneCode")
    public ResultResponse phoneCode(String phone, Integer zt) {
        //返回前端的数据
        ResultResponse message;
        if (zt == 1) {
            //获取验证码发送状态
            message = serviceUser.getMessage(phone, null);
        } else {
            //根据手机号查询用户名
            User phoneData = serviceUser.getByPhone(phone);
            //判断手机号有没有注册
            if (phoneData == null) {
                resultResponse.setCode(401);
                resultResponse.setMessage("这个手机号没有绑定账户");
                return resultResponse;
            } else {
                //获取验证码发送状态
                message = serviceUser.getMessage(phone, phoneData);
            }
        }
        return message;
    }

    //验证手机验证码
    @RequestMapping("phoneCodeVerification")
    public ResultResponse phoneCodeVerification(String phoneCode, String phone, String password) {
        //根据手机号查询用户名
        User phoneData = serviceUser.getByPhone(phone);
        String userPassword = phoneData.getPassword();
        //从redis中获取手机验证码
        String code = (String) redisTemplateUtil.get(phoneData.getUsername() + "PhoneCode");
        return serviceUser.isMessage(phoneCode, code, phoneData, password, userPassword);
    }
}